/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package videorent;

import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Iterator;

/** Representa a un alquiler de objetos.
 *
 * @author Rafael
 */
public class Alquiler extends Operacion {

    /** Es el Constructor del Alquiler
     * @param total monto total de la Venta.
     * @param montoEntregado monto entregado por una persona.
     * @param articulos monto entregado por una persona.
     */
    public Alquiler(double total, double montoEntregado, ArrayList<Object> articulos) {
        super(total, montoEntregado, articulos);
    }

    /** Es el Constructor del Alquiler
     * @param articulos monto entregado por una persona.
     */
    public Alquiler(ArrayList<Object> articulos) {
        super(0, 0, articulos);
    }

    /** Es el Constructor vacio del Alquiler
     */
    public Alquiler() {
        super();
    }

    /**Este metodo retorna una lista con los objetos que hayq que devolver el
     * para la fecha considerada.
     * @param fecha Fecha a considerar, para ver el vencimiento.
     * @return Lista de articulos a devolver hoy
     */
    public ArrayList<Object> getarticulosDevolverHoy(GregorianCalendar fecha) {
        // Obtengo una copia de las ventas del asociado
        ArrayList<Object> alquileres = this.getArticulos();
        ArrayList<Object> articulosDevolverHoy = new ArrayList<Object>();
        Iterator<Object> iter = alquileres.iterator();
        while (iter.hasNext()) {
            // Obtengo el alrticulo
            Object o = iter.next();
            if (o instanceof Pelicula) {
                Pelicula p = (Pelicula) o;
                // Si no es la misma fecha quito el articulo
                if ((p.getFechaDevolucion()).equals(fecha)) {
                    articulosDevolverHoy.add(p);
                }
            } else if (o instanceof TemporadaSerie) {
                TemporadaSerie t = (TemporadaSerie) o;
                // Si no es la misma fecha quito el articulo
                if ((t.getFechaDevolucion()).equals(fecha)) {
                    articulosDevolverHoy.add(t);
                }
            } else if (o instanceof JuegoEducativo) {
                JuegoEducativo je = (JuegoEducativo) o;
                // Si no es la misma fecha quito el articulo
                if ((je.getFechaDevolucion()).equals(fecha)) {
                    articulosDevolverHoy.add(je);
                }
            } else if (o instanceof JuegoRecreativo) {
                JuegoRecreativo jr = (JuegoRecreativo) o;
                // Si no es la misma fecha quito el articulo
                if ((jr.getFechaDevolucion()).equals(fecha)) {
                    articulosDevolverHoy.add(jr);
                }
            }
        }
        // Retorno la lista de los objetos que cuyo alquiler vence hoy
        return articulosDevolverHoy;
    }

    /**
     * Este metodo calcula el precio de la lista de articulos a alquilar.
     * @return el total a pagar por los articulos a alquilar.
     */
    @Override
    public double obtenerSubtotal() {
        double subtotal = 0;
        int i = 0;
        
        ArrayList<Object> articulos = this.getArticulos();
        
        while (i < articulos.size()) {
            Object ob = articulos.get(i);
            
            if (ob instanceof Pelicula) {
                subtotal = subtotal + ALQUILER_PELICULA;
            } else if (ob instanceof TemporadaSerie) {
                subtotal = subtotal + ALQUILER_SERIE;
            } else if (ob instanceof JuegoEducativo) {
                subtotal = subtotal + ALQUILER_JUEGO_EDUCATIVO;
            } else if (ob instanceof JuegoRecreativo) {
                subtotal = subtotal + ALQUILER_JUEGO_RECREATIVO;
            }
            i++;
        }
        return subtotal;
    }

    /** Este metodo se encarga de decir para un alquiler cuantos objetos hay con
     * el mismo código.
     * @param codigo  codigo a comparar
     */
    public int objetosIguales(String codigo) {
        int cant = 0;
        
        // Obtengo los articulos de esa operacion
        ArrayList<Object> articulos = this.getArticulos();
        Iterator<Object> itArt = articulos.iterator();
        Articulo art;
        // Para cada articulo
        while (itArt.hasNext()) {
            art = (Articulo) itArt.next();
            // Si el codigo del articulo coincide con el del codigo pasado.
            if(art.getCodigo().equals(codigo)){
                cant++;
            }   
        }
        return cant;
    }
}
